package com.foreknow.test;

import com.foreknow.db.c3p0Utils;
import com.foreknow.entity.User;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.*;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * DBUtils执行数据库查询操作
 * 1.QueryRunner(DataSource)
 * 2.query(String sql,ResultSetHandler<T> rsh,Object...params);
 */
public class DBUtilDemo {
    public static void main(String[] args) {
        //		queryDemo01();
//		queryDemo02();
//		queryDemo03();
//		queryDemo04();
//		queryDemo05();
//        try {
//            queryDemo06();
//        } catch (SQLException e) {
//            e.printStackTrace();
//        }
        try {
            queryDemo07();
        } catch (SQLException e) {
            e.printStackTrace();
        }
//		queryDemo08();
    }

    // ArrayHandler处理类的使用
    //将结果集中的额第一条记录封装到一个object[]数组中
    public static void queryDemo01() throws SQLException{
        // 1.创建QueryRunner对象
        QueryRunner qr = new QueryRunner(c3p0Utils.getDataSourse());
        // 2.执行查询
        Object[] objs = qr.query("select * from user where cid = ?", new ArrayHandler(), 1);
        for(Object o: objs){		// object[]中保存了object对象
            System.out.println(o);
        }
    }

    // ArrayListHandler
    //讲结果集中的每一条数据都封装到object[]数组中，将这些数组封装在list集合中
    public static void queryDemo02() throws SQLException{
        // 1.创建QueryRunner对象
        QueryRunner qr = new QueryRunner(c3p0Utils.getDataSourse());
        // 2.执行查询
        List<Object[]> objs = qr.query("select * from user ", new ArrayListHandler());
        for (Object[] objects : objs) {
            System.out.println(objects[0]+"\t"+objects[1]);
        }
    }

    // BeanHandler处理类的使用
    //将结果集中的第一条记录封装到一个指定的JavaBean中
    public static void queryDemo03() throws SQLException{
        // 1.创建QueryRunner对象
        QueryRunner qr = new QueryRunner(c3p0Utils.getDataSourse());
        // 2.执行查询
        String sql = "select * from user";
        User c = qr.query(sql, new BeanHandler<User>(User.class));
        System.out.println(c);
    }

    // BeanListHandler
    //将结果集中的每一条数据封装到指定的JavaBean中，将JavaBean封装到list数组中
    public static void queryDemo04() throws SQLException{
        // 1.创建QueryRunner对象
        QueryRunner qr = new QueryRunner(c3p0Utils.getDataSourse());
        // 2.执行查询
        String sql = "select * from user";
        List<User> c = qr.query(sql, new BeanListHandler<User>(User.class));
        for (User user : c) {
            System.out.println(user);
        }
    }

    // ColumnListHandler处理类的使用
    //将结果集中的指定的列的字段值封装到list集合中
    public static void queryDemo05() throws SQLException{
        // 1.创建QueryRunner对象
        QueryRunner qr = new QueryRunner(c3p0Utils.getDataSourse());
        // 2.执行查询
        String sql = "select * from user";
        List<Object> c = qr.query(sql, new ColumnListHandler<Object>("cname"));
        System.out.println(c);
    }

    // MapHandler处理类的使用
    //将结果集中的第一条数据封装到了map集合当中
    public static void queryDemo06() throws SQLException{
        // 1.创建QueryRunner对象
        QueryRunner qr = new QueryRunner(c3p0Utils.getDataSourse());
        // 2.执行查询
        String sql = "select * from user";
        Map<String, Object> map = qr.query(sql, new MapHandler());
        // 3.
        System.out.println(map);
    }

    // MapListHandler处理类的使用
    //将结果集中的每一条数据封装到了map集合当中，将map集合封装到list集合当中
    public static void queryDemo07() throws SQLException {
        // 1.创建QueryRunner对象
        QueryRunner qr = new QueryRunner(c3p0Utils.getDataSourse());
        // 2.执行查询
        String sql = "select * from user";
        List<Map<String, Object>> maps = qr.query(sql, new MapListHandler());
        // 3.List
        System.out.println(maps);
    }

    // ScalarHandler处理类的使用
    //用于单个数据 例如：select count(*) from 表名
    public static void queryDemo08() throws SQLException{
        // 1.创建QueryRunner对象
        QueryRunner qr = new QueryRunner(c3p0Utils.getDataSourse());
        // 2.执行查询
        String sql = "select count(*) from user";
        Long count = qr.query(sql, new ScalarHandler<Long>());
        // 3.List
        System.out.println(count);
    }


}
